package com.jijuxie.system.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jijuxie.common.core.R;
import com.jijuxie.system.domain.SysRole;
import com.jijuxie.system.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理控制器 处理角色及其权限的管理操作
 *
 * @author jijuxie
 */
@RestController
@RequestMapping("/system/role")
public class SysRoleController {

    @Autowired
    private ISysRoleService roleService;

    /**
     * 获取角色列表 支持分页查询和条件过滤
     *
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param role 查询条件
     */
    @GetMapping("/list")
    public R<Page<SysRole>> list(
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
            SysRole role) {
        Page<SysRole> page = roleService.page(new Page<>(pageNum, pageSize),
                new LambdaQueryWrapper<SysRole>()
                        .like(role.getRoleName() != null, SysRole::getRoleName, role.getRoleName())
                        .eq(role.getStatus() != null, SysRole::getStatus, role.getStatus())
                        .orderByAsc(SysRole::getRoleSort));
        return R.ok(page);
    }

    /**
     * 根据角色编号获取详细信息
     */
    @GetMapping("/{roleId}")
    public R<SysRole> getInfo(@PathVariable Long roleId) {
        return R.ok(roleService.selectRoleById(roleId));
    }

    /**
     * 新增角色
     */
    @PostMapping
    public R<Void> add(@RequestBody SysRole role) {
        if (!roleService.checkRoleNameUnique(role.getRoleName())) {
            return R.fail("新增角色'" + role.getRoleName() + "'失败，角色名称已存在");
        }
        if (!roleService.checkRoleKeyUnique(role.getRoleKey())) {
            return R.fail("新增角色'" + role.getRoleName() + "'失败，角色权限已存在");
        }
        roleService.save(role);
        return R.ok();
    }

    /**
     * 修改角色
     */
    @PutMapping
    public R<Void> edit(@RequestBody SysRole role) {
        roleService.updateById(role);
        return R.ok();
    }

    /**
     * 删除角色
     */
    @DeleteMapping("/{roleIds}")
    public R<Void> remove(@PathVariable Long[] roleIds) {
        for (Long roleId : roleIds) {
            roleService.removeById(roleId);
        }
        return R.ok();
    }

    /**
     * 修改角色菜单权限 更新角色-菜单关联关系
     *
     * @param roleId 角色ID
     * @param menuIds 菜单ID列表
     */
    @PutMapping("/menu")
    public R<Void> updateRoleMenu(@RequestParam Long roleId, @RequestBody List<Long> menuIds) {
        roleService.updateRoleMenus(roleId, menuIds);
        return R.ok();
    }

    /**
     * 获取角色菜单ID列表
     */
    @GetMapping("/menu/{roleId}")
    public R<List<Long>> getRoleMenuIds(@PathVariable Long roleId) {
        return R.ok(roleService.selectMenuIdsByRoleId(roleId));
    }

    /**
     * 批量用户授权 批量建立用户-角色关联关系
     */
    @PutMapping("/authUser")
    public R<Void> insertAuthUsers(@RequestParam Long roleId, @RequestBody List<Long> userIds) {
        roleService.insertAuthUsers(roleId, userIds);
        return R.ok();
    }

    /**
     * 取消授权用户
     */
    @DeleteMapping("/authUser/{roleId}/{userId}")
    public R<Void> deleteAuthUser(@PathVariable Long roleId, @PathVariable Long userId) {
        roleService.deleteAuthUser(roleId, userId);
        return R.ok();
    }
}
